package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.DescuentoPuestoDAO;
import mx.ipn.persistencia.dao.DescuentoDAO;
import mx.ipn.persistencia.dao.PuestoDAO;
import mx.ipn.to.DescuentoPuestoTO;
import mx.ipn.to.DescuentoTO;
import mx.ipn.to.PuestoTO;

public class DescuentoPuestoDAOMySQL implements DescuentoPuestoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(DescuentoPuestoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO descuento_puesto(id_descuento,id_puesto) VALUES(?,?)";
	private static final String UPDATE = "UPDATE descuento_puesto SET id_descuento=?,id_puesto=? WHERE id_descuento=? and id_puesto=?";
	private static final String FINDBYDESCUENTOPUESTO = "SELECT * FROM descuento_puesto WHERE id_descuento=? and id_puesto=?";
	private static final String SELECT = "SELECT * FROM descuento_puesto";
	private static final String SELECTBYDESCUENTO = "SELECT * FROM descuento_puesto WHERE id_descuento=?";
	private static final String SELECTBYPUESTO = "SELECT * FROM descuento_puesto WHERE id_puesto=?";

	@Override
	public DescuentoPuestoTO findDescuentoPuestoByDescuentoPuesto(
			int idDescuento, short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYDESCUENTOPUESTO);

			ps.setInt(1, idDescuento);
			ps.setShort(2, idPuesto);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				DescuentoDAO descuentoDAO = fabricaMySQL.getDescuentoDAO();
				PuestoDAO puestoDAO = fabricaMySQL.getPuestoDAO();

				DescuentoPuestoTO descuentoPuestoTO = new DescuentoPuestoTO(
						descuentoDAO.findDescuentoById(idDescuento), puestoDAO
								.findPuestoById(idPuesto));

				ps.close();
				conexion.close();
				return descuentoPuestoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertDescuentoPuesto(DescuentoPuestoTO descuentoPuestoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, descuentoPuestoTO.getDescuentoTO().getIdDescuento());
			ps.setShort(2, descuentoPuestoTO.getPuestoTO().getIdPuesto());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<DescuentoPuestoTO> selectDescuentoPuesto() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			DescuentoDAO descuentoDAO = null;
			PuestoDAO puestoDAO = null;

			ArrayList<DescuentoPuestoTO> descuentoPuestoTO = null;
			DescuentoPuestoTO descuentoPuestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (descuentoPuestoTO == null) {
					descuentoPuestoTO = new ArrayList<DescuentoPuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					descuentoDAO = fabricaMySQL.getDescuentoDAO();
					puestoDAO = fabricaMySQL.getPuestoDAO();
				}

				descuentoPuestoTO2 = new DescuentoPuestoTO(descuentoDAO
						.findDescuentoById(rs.getInt("id_descuento")),
						puestoDAO.findPuestoById(rs.getShort("id_puesto")));

				descuentoPuestoTO.add(descuentoPuestoTO2);
			}
			ps.close();
			conexion.close();
			return descuentoPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DescuentoPuestoTO selectDescuentoPuestoByDescuento(int idDescuento) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			DescuentoDAO descuentoDAO = null;
			PuestoDAO puestoDAO = null;

			ArrayList<PuestoTO> listPuestoTO = null;

			DescuentoPuestoTO descuentoPuestoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYDESCUENTO);
			ps.setInt(1, idDescuento);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listPuestoTO == null) {

					listPuestoTO = new ArrayList<PuestoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					puestoDAO = fabricaMySQL.getPuestoDAO();
					descuentoDAO = fabricaMySQL.getDescuentoDAO();
				}

				listPuestoTO.add(puestoDAO.findPuestoById(rs
						.getShort("id_puesto")));

			}
			if (listPuestoTO != null) {
				DescuentoTO descuentoTO = descuentoDAO
						.findDescuentoById(idDescuento);
				
				PuestoTO[] arrPuestoTO = (PuestoTO[])listPuestoTO.toArray(new PuestoTO[listPuestoTO.size()]);
				
				descuentoPuestoTO = new DescuentoPuestoTO(descuentoTO,
						arrPuestoTO);
			}
			ps.close();
			conexion.close();
			return descuentoPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DescuentoPuestoTO selectDescuentoPuestoByPuesto(short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			DescuentoDAO descuentoDAO = null;
			PuestoDAO puestoDAO = null;

			ArrayList<DescuentoTO> listDescuentoTO = null;

			DescuentoPuestoTO descuentoPuestoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYPUESTO);
			ps.setShort(1, idPuesto);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listDescuentoTO == null) {

					listDescuentoTO = new ArrayList<DescuentoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					descuentoDAO = fabricaMySQL.getDescuentoDAO();
					puestoDAO = fabricaMySQL.getPuestoDAO();
				}

				listDescuentoTO.add(descuentoDAO.findDescuentoById(rs
						.getInt("id_descuento")));

			}
			if (listDescuentoTO != null) {
				PuestoTO puestoTO = puestoDAO.findPuestoById(idPuesto);
				
				DescuentoTO[] arrDescuentoTO = (DescuentoTO[])listDescuentoTO.toArray(new DescuentoTO[listDescuentoTO.size()]);
				
				descuentoPuestoTO = new DescuentoPuestoTO(arrDescuentoTO,
						puestoTO);
			}
			ps.close();
			conexion.close();
			return descuentoPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateDescuentoPuesto(DescuentoPuestoTO descuentoPuestoTO,
			DescuentoPuestoTO descuentoPuestoTONuevo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, descuentoPuestoTONuevo.getDescuentoTO()
					.getIdDescuento());
			ps.setShort(2, descuentoPuestoTONuevo.getPuestoTO().getIdPuesto());
			ps.setInt(3, descuentoPuestoTO.getDescuentoTO().getIdDescuento());
			ps.setShort(4, descuentoPuestoTO.getPuestoTO().getIdPuesto());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
